package com.partsoft.dits.integrate;

import com.partsoft.dits.DataDescriptorManager;
import com.partsoft.dits.LdapDataEdgeDescriptor;
import com.partsoft.dits.TableDataEdgeDescriptor;

/**
 * 表数据广播描述符管理器
 */
public interface LdapDataDescriptorManager<E extends LdapDataEdgeDescriptor> extends DataDescriptorManager<E>, LdapDataDescriptorRegistry<E> {
	
	/**
	 * 是否有指定的描述符
	 * @param descritpor 指定的描述符
	 * @return 有则返回true,否则返回false
	 */
	boolean hasDescriptor(E descriptor);
	
	/**
	 * 添加一个描述符
	 * @param descriptor 指定的描述符
	 * @return 添加后的描述符
	 * @exception RuntimeException 如果存在相同的描述符，则抛出异常。
	 */
	E addDescriptor(E descriptor) throws RuntimeException;
	
	/**
	 * 移除描述符
	 * @param descriptor 指定的描述符
	 * @return 如果成功移除则返回true， 否则返回false
	 */
	E removeDescriptor(E descriptor);
	
	/**
	 * 编辑描述符
	 * @param descriptor 需要保存的描述符
	 * @return 返回修改后的描述符。
	 */
	E modifyDescriptor(E descriptor);
	
	/**
	 * 支持的描述符类
	 */
	Class<E> getSupportClass();

	/**
	 * 获得所有的描述符
	 */
	E[] getDescriptors();
	
	/**
	 * 根据消息代码获取边界描述符
	 * @param messageCode 消息代码
	 */
	E[] getDescriptors(String messageCode);
	
	/**
	 * 根据描述符ID获取描述符
	 * @return
	 * @exception RuntimeException 如果找不到则抛出异常
	 */
	E getDescriptor(String id) throws RuntimeException;
	
	/**
	 * 判断ID是否存在
	 * @param id
	 * @return
	 */
	boolean hasDescriptor(String id);
	
	/**
	 * 根据ID移除描述符
	 * @param id 
	 */
	E removeDescriptor(String id);
	
	/**
	 * 获取指定的描述符
	 * @param contextId LDAP容器ID
	 * @param parentDN 父亲DN
	 * @param propertyId 数据属性ID
	 * @param messageCode 消息代码
	 * @return 实现{@link TableDataEdgeDescriptor}接口的对象
	 */
	E getDescriptor(String contextId, String parentDN, String propertyId, String messageCode);
	
}
